#ifndef FREERTOS_TIMER_H
#define FREERTOS_TIMER_H

#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>

/**
 * 定时器模式枚举（与FreeRTOS一致）
 */
typedef enum {
    timerONE_SHOT = 0,  // 单次触发：定时结束后自动停止
    timerPERIODIC       // 周期触发：定时结束后重新开始
} TimerMode;

/**
 * 定时器状态枚举
 */
typedef enum {
    TIMER_INACTIVE = 0, // 未激活（未启动或已停止）
    TIMER_ACTIVE        // 激活（运行中）
} TimerState;

/**
 * 定时器回调函数类型
 * 注意：回调函数在"定时器任务"或主循环中执行（非中断）
 * @param pvParameters 用户自定义参数
 */
typedef void (*TimerCallbackFunction_t)(void* pvParameters);

/**
 * 定时器结构体（模拟FreeRTOS的Timer_t）
 * 采用双向链表便于插入/删除
 */
typedef struct Timer {
    struct Timer* pxNext;          // 下一个定时器（双向链表）
    struct Timer* pxPrevious;      // 上一个定时器（双向链表）
    TimerCallbackFunction_t pxCallbackFunction; // 回调函数
    void* pvParameters;            // 用户参数
    uint32_t ulTimerPeriod;        // 定时周期（毫秒）
    uint32_t ulExpireTime;         // 到期时间（系统滴答数）
    TimerMode eTimerMode;          // 定时器模式
    TimerState eTimerState;        // 定时器状态
    bool bExpired;                 // 标记是否已到期（等待执行回调）
} Timer_t;

/**
 * 定时器管理器结构体（管理所有定时器）
 */
typedef struct {
    Timer_t* pxActiveTimerList;    // 激活的定时器链表
    uint32_t (*pxGetSystemTick)(void); // 获取系统滴答数的回调（毫秒级）
    uint32_t ulCurrentTime;        // 当前系统时间（缓存，减少回调调用）
} TimerManager_t;

/**
 * 初始化定时器管理器
 * @param pxManager 定时器管理器实例
 * @param pxGetTickFunc 获取系统滴答数的函数（需返回毫秒级计数）
 */
void vTimerManagerInit(TimerManager_t* pxManager, uint32_t (*pxGetTickFunc)(void));

/**
 * 创建定时器（类似FreeRTOS的xTimerCreate）
 * @param pxTimer 定时器实例（用户分配内存，建议全局/静态变量）
 * @param ulPeriod 定时周期（毫秒）
 * @param eMode 定时器模式（单次/周期）
 * @param pvParameters 用户参数
 * @param pxCallback 回调函数
 */
void vTimerCreate(Timer_t* pxTimer,
                 uint32_t ulPeriod,
                 TimerMode eMode,
                 void* pvParameters,
                 TimerCallbackFunction_t pxCallback);

/**
 * 启动定时器（类似FreeRTOS的xTimerStart）
 * @param pxManager 定时器管理器
 * @param pxTimer 要启动的定时器
 * @param ulStartDelay 启动延迟（毫秒，0表示立即启动）
 * @return 成功返回true，失败返回false（参数无效）
 */
bool xTimerStart(TimerManager_t* pxManager, Timer_t* pxTimer, uint32_t ulStartDelay);

/**
 * 停止定时器（类似FreeRTOS的xTimerStop）
 * @param pxManager 定时器管理器
 * @param pxTimer 要停止的定时器
 */
void vTimerStop(TimerManager_t* pxManager, Timer_t* pxTimer);

/**
 * 定时器处理函数（核心函数，类似FreeRTOS的定时器服务任务）
 * 需在任务或主循环中周期性调用，执行到期定时器的回调
 */
void vTimerProcess(TimerManager_t* pxManager);

#endif